// Copyright (C) Kumo inc. and its affiliates.
// Author: Jeff.li lijippy@163.com
// All rights reserved.
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published
// by the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program.  If not, see <https://www.gnu.org/licenses/>.
//
#include <pollux/expression/expr.h>
#include <pollux/expression/vector_function.h>

namespace kumo::pollux::functions {
    namespace {
        class RowFunction : public exec::VectorFunction {
        public:
            void apply(
                const SelectivityVector &rows,
                std::vector<VectorPtr> &args,
                const TypePtr &outputType,
                exec::EvalCtx &context,
                VectorPtr &result) const override {
                auto argsCopy = args;
                RowVectorPtr row = std::make_shared<RowVector>(
                    context.pool(),
                    outputType,
                    BufferPtr(nullptr),
                    rows.end(),
                    std::move(argsCopy),
                    0 /*nullCount*/);
                context.moveOrCopyResult(row, rows, result);
            }
        };
    } // namespace

    POLLUX_DECLARE_VECTOR_FUNCTION_WITH_METADATA(
        udf_concat_row,
        std::vector<std::shared_ptr<exec::FunctionSignature>>{},
        exec::VectorFunctionMetadataBuilder().defaultNullBehavior(false).build(),
        std::make_unique<RowFunction>());
} // namespace kumo::pollux::functions
